from pydantic import BaseModel, Field, validator
from typing import Optional


class YouTubeInfoRequest(BaseModel):
    """获取YouTube视频信息请求DTO"""
    youtube_url: str = Field(..., description="YouTube视频链接", min_length=1, max_length=2048)
    
    @validator('youtube_url')
    def validate_youtube_url(cls, v):
        """验证YouTube URL格式"""
        if not v or not v.strip():
            raise ValueError('YouTube链接不能为空')
        
        v = v.strip()
        
        # 简单的YouTube URL格式验证
        valid_domains = ['youtube.com', 'www.youtube.com', 'm.youtube.com', 'youtu.be']
        
        if not any(domain in v for domain in valid_domains):
            raise ValueError('请提供有效的YouTube链接')
        
        if not (v.startswith('http://') or v.startswith('https://')):
            raise ValueError('链接格式不正确，必须以http://或https://开头')
        
        return v


class YouTubeDownloadRequest(BaseModel):
    """YouTube视频下载请求DTO"""
    youtube_url: str = Field(..., description="YouTube视频链接", min_length=1, max_length=2048)
    quality: Optional[str] = Field("720p", description="视频质量", max_length=10)
    upload_to_qiniu: Optional[bool] = Field(True, description="是否上传到七牛云")
    
    @validator('youtube_url')
    def validate_youtube_url(cls, v):
        """验证YouTube URL格式"""
        if not v or not v.strip():
            raise ValueError('YouTube链接不能为空')
        
        v = v.strip()
        
        # 简单的YouTube URL格式验证
        valid_domains = ['youtube.com', 'www.youtube.com', 'm.youtube.com', 'youtu.be']
        
        if not any(domain in v for domain in valid_domains):
            raise ValueError('请提供有效的YouTube链接')
        
        if not (v.startswith('http://') or v.startswith('https://')):
            raise ValueError('链接格式不正确，必须以http://或https://开头')
        
        return v
    
    @validator('quality')
    def validate_quality(cls, v):
        """验证视频质量"""
        if v:
            valid_qualities = ['360p', '480p', '720p', '1080p', 'best', 'worst']
            if v.lower() not in [q.lower() for q in valid_qualities]:
                raise ValueError(f'无效的视频质量，支持的质量: {", ".join(valid_qualities)}')
            return v.lower()
        return "720p"  # 默认720p


class YouTubeUrlRequest(BaseModel):
    """获取YouTube下载链接请求DTO"""
    youtube_url: str = Field(..., description="YouTube视频链接", min_length=1, max_length=2048)
    quality: Optional[str] = Field("720p", description="视频质量", max_length=10)
    
    @validator('youtube_url')
    def validate_youtube_url(cls, v):
        """验证YouTube URL格式"""
        if not v or not v.strip():
            raise ValueError('YouTube链接不能为空')
        
        v = v.strip()
        
        # 简单的YouTube URL格式验证
        valid_domains = ['youtube.com', 'www.youtube.com', 'm.youtube.com', 'youtu.be']
        
        if not any(domain in v for domain in valid_domains):
            raise ValueError('请提供有效的YouTube链接')
        
        if not (v.startswith('http://') or v.startswith('https://')):
            raise ValueError('链接格式不正确，必须以http://或https://开头')
        
        return v
    
    @validator('quality')
    def validate_quality(cls, v):
        """验证视频质量"""
        if v:
            valid_qualities = ['360p', '480p', '720p', '1080p', 'best', 'worst']
            if v.lower() not in [q.lower() for q in valid_qualities]:
                raise ValueError(f'无效的视频质量，支持的质量: {", ".join(valid_qualities)}')
            return v.lower()
        return "720p"  # 默认720p


class YouTubeProfessionalDownloadRequest(BaseModel):
    """YouTube专业下载器请求DTO"""
    youtube_url: str = Field(..., description="YouTube视频链接", min_length=1, max_length=2048)
    quality: Optional[str] = Field("1080p", description="目标视频质量（1080p, 720p, 480p, best）", max_length=10)
    upload_to_qiniu: Optional[bool] = Field(False, description="是否上传到七牛云存储")
    proxy_url: Optional[str] = Field(None, description="代理服务器URL（如：http://127.0.0.1:7890）", max_length=256)
    cookies_file: Optional[str] = Field(None, description="YouTube cookies文件路径（如：./youtube_cookies.txt）", max_length=512)
    
    @validator('youtube_url')
    def validate_youtube_url(cls, v):
        """验证YouTube URL格式"""
        if not v or not v.strip():
            raise ValueError('YouTube链接不能为空')
        
        v = v.strip()
        
        # 简单的YouTube URL格式验证
        valid_domains = ['youtube.com', 'www.youtube.com', 'm.youtube.com', 'youtu.be']
        
        if not any(domain in v for domain in valid_domains):
            raise ValueError('请提供有效的YouTube链接')
        
        if not (v.startswith('http://') or v.startswith('https://')):
            raise ValueError('链接格式不正确，必须以http://或https://开头')
        
        return v
    
    @validator('quality')
    def validate_quality(cls, v):
        """验证视频质量"""
        if v:
            # 专业下载器支持的质量选项
            valid_qualities = ['1080p', '720p', '480p', 'best']
            if v.lower() not in [q.lower() for q in valid_qualities]:
                raise ValueError(f'专业下载器不支持的质量选项: {v}。支持的选项: {", ".join(valid_qualities)}')
            return v.lower()
        return "1080p"  # 专业下载器默认1080p
    
    @validator('proxy_url')
    def validate_proxy_url(cls, v):
        """验证代理URL格式"""
        if v:
            v = v.strip()
            if not v:
                return None
            
            # 验证代理URL格式
            if not (v.startswith('http://') or v.startswith('https://') or v.startswith('socks5://')):
                raise ValueError('代理URL格式不正确，必须以http://、https://或socks5://开头')
            
            return v
        return None
    
    @validator('cookies_file')
    def validate_cookies_file(cls, v):
        """验证cookies文件路径"""
        if v:
            v = v.strip()
            if not v:
                return None
            
            # 检查文件是否存在（可选验证）
            import os
            if not os.path.exists(v):
                # 不抛出错误，只是警告，因为文件可能在服务器上的不同位置
                pass
            
            return v
        return None


class YouTubeProfessionalValidateRequest(BaseModel):
    """YouTube专业下载器URL验证请求DTO"""
    youtube_url: str = Field(..., description="YouTube视频链接", min_length=1, max_length=2048)
    
    @validator('youtube_url')
    def validate_youtube_url(cls, v):
        """验证YouTube URL格式"""
        if not v or not v.strip():
            raise ValueError('YouTube链接不能为空')
        
        v = v.strip()
        
        # 简单的YouTube URL格式验证
        valid_domains = ['youtube.com', 'www.youtube.com', 'm.youtube.com', 'youtu.be']
        
        if not any(domain in v for domain in valid_domains):
            raise ValueError('请提供有效的YouTube链接')
        
        if not (v.startswith('http://') or v.startswith('https://')):
            raise ValueError('链接格式不正确，必须以http://或https://开头')
        
        return v